﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataObjects;
using System.Data.SqlClient;
using InfrastructureSqlServer.Helpers;
using System.Configuration;
using System.Data;

namespace DataAccess
{
    public class OperacaoLancamentoDAO
    {
        private List<OperacaoLancamento> CarregarListaOperacaoLancamento(SqlDataReader dr)
        {
            List<OperacaoLancamento> liOperacaoLancamento = new List<OperacaoLancamento>();

            while (dr.Read())
            {
                OperacaoLancamento OperacaoLancamento = new OperacaoLancamento();
                OperacaoLancamento.OperacaoLancamentoId = int.Parse(dr["OperacaoLancamentoId"].ToString());
                OperacaoLancamento.CaixaOperacaoId = int.Parse(dr["CaixaOperacaoId"].ToString());
                OperacaoLancamento.Valor = decimal.Parse(dr["Valor"].ToString());
                OperacaoLancamento.DataAcao = Convert.ToDateTime(dr["DataAcao"].ToString());
                OperacaoLancamento.Observacao = dr["Observacao"].ToString();
                if (dr["ProdutoId"].ToString() != string.Empty)
                {
                    OperacaoLancamento.ProdutoId = int.Parse(dr["ProdutoId"].ToString());
                    ProdutoDAO _produtoDAO = new ProdutoDAO();
                    OperacaoLancamento.Produto = _produtoDAO.Consultar(OperacaoLancamento.ProdutoId)[0];

                }
                
                liOperacaoLancamento.Add(OperacaoLancamento);
            }

            return liOperacaoLancamento;
        }

        public void Inserir(OperacaoLancamento _operacaoLancamento)
        {
            SqlParameter[] paramsToSP = new SqlParameter[5];

            paramsToSP[0] = new SqlParameter("@CaixaOperacaoId", _operacaoLancamento.CaixaOperacaoId);
            paramsToSP[1] = new SqlParameter("@Valor", _operacaoLancamento.Valor);
            paramsToSP[2] = new SqlParameter("@DataAcao", _operacaoLancamento.DataAcao);
            paramsToSP[3] = new SqlParameter("@Observacao", _operacaoLancamento.Observacao);
            paramsToSP[4] = new SqlParameter("@ProdutoId", _operacaoLancamento.ProdutoId);

            try
            {
                SqlHelper.ExecuteNonQuery(ConfigurationManager.ConnectionStrings["conexao"].ToString(),
                                            CommandType.StoredProcedure, "stp_insert_operacaolancamento", paramsToSP);

            }
            catch (Exception e)
            {
                throw new Exception("Erro ao inserir operação lançamento, Erro: " + e.Message);
            }

        }

        public bool Alterar(OperacaoLancamento _operacaoLancamento)
        {
            SqlParameter[] paramsToSP = new SqlParameter[6];

            paramsToSP[0] = new SqlParameter("@OperacaoLancamentoId", _operacaoLancamento.OperacaoLancamentoId);
            paramsToSP[1] = new SqlParameter("@CaixaOperacaoId", _operacaoLancamento.CaixaOperacaoId);
            paramsToSP[2] = new SqlParameter("@Valor", _operacaoLancamento.Valor);
            paramsToSP[3] = new SqlParameter("@DataAcao", _operacaoLancamento.DataAcao);
            paramsToSP[4] = new SqlParameter("@Observacao", _operacaoLancamento.Observacao);
            paramsToSP[5] = new SqlParameter("@ProdutoId", _operacaoLancamento.ProdutoId);


            try
            {
                SqlHelper.ExecuteNonQuery(ConfigurationManager.ConnectionStrings["conexao"].ToString(),
                                            CommandType.StoredProcedure, "stp_update_operacaolancamento", paramsToSP);
                return true;
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao alterar operação lançamento, Erro: " + e.Message);
            }

        }

        public bool Deletar(int _operacaoLancamentoId)
        {
            SqlParameter[] paramsToSP = new SqlParameter[1];

            paramsToSP[0] = new SqlParameter("@OperacaoLancamentoId", _operacaoLancamentoId);

            try
            {
                SqlHelper.ExecuteNonQuery(ConfigurationManager.ConnectionStrings["conexao"].ToString(),
                                            CommandType.StoredProcedure, "stp_delete_operacao_lancamento", paramsToSP);
                return true;
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao deletar operação lançamento, Erro: " + e.Message);
            }

        }

        public List<OperacaoLancamento> Consultar(int _operacaoLancamentoId)
        {
            string sqlQuery = string.Format("SELECT * FROM OPERACAOLANCAMENTO WHERE OPERACAOLANCAMENTOID = {0}", _operacaoLancamentoId);

            try
            {
                return CarregarListaOperacaoLancamento(SqlHelper.ExecuteReader(ConfigurationManager.ConnectionStrings["conexao"].ToString(),
                                            CommandType.Text, sqlQuery));
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao consultar operação lançamento, Erro: " + e.Message);
            }
            
        }

        public List<OperacaoLancamento> ConsultarCaixaOperacao(int _caixaoperacaoid)
        {
            string sqlQuery = string.Format("SELECT * FROM OPERACAOLANCAMENTO WHERE caixaoperacaoID = {0}", _caixaoperacaoid);

            try
            {
                return CarregarListaOperacaoLancamento(SqlHelper.ExecuteReader(ConfigurationManager.ConnectionStrings["conexao"].ToString(),
                                            CommandType.Text, sqlQuery));
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao consultar operação lançamento, Erro: " + e.Message);
            }

        }

    }//class
}//namespace
